﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Windows.Controls;
using System.Windows;



namespace WpfPropertyGrid
{
    /// <summary>
    /// A base class for all value editors.
    /// </summary>
    public abstract class Editor : DependencyObject
    {
        private static readonly Type ThisType = typeof(Editor);
        /// <summary>
        /// Identifies the <see cref="InlineTemplate"/> property. This is a dependency property.
        /// </summary>
        public static readonly DependencyProperty InlineTemplateProperty =
          DependencyProperty.Register("InlineTemplate", typeof(object), ThisType, new PropertyMetadata(null), ValidateTemplateValue);

        /// <summary>
        /// Gets or sets the inline template. Can be either DataTemplate or ComponentResourceKey object.
        /// </summary>
        /// <value>The inline template.</value>
        public object InlineTemplate
        {
            get { return GetValue(InlineTemplateProperty); }
            set { SetValue(InlineTemplateProperty, value); }
        }

        /// <summary>
        /// Identifies the <see cref="ExtendedTemplate"/> property. This is a dependency property.
        /// </summary>
        public static readonly DependencyProperty ExtendedTemplateProperty =
          DependencyProperty.Register("ExtendedTemplate", typeof(object), ThisType, new PropertyMetadata(null), ValidateTemplateValue);

        /// <summary>
        /// Gets or sets the extended template. Can be either DataTemplate or ComponentResourceKey object.
        /// </summary>
        /// <value>The extended template.</value>
        public object ExtendedTemplate
        {
            get { return GetValue(ExtendedTemplateProperty); }
            set { SetValue(ExtendedTemplateProperty, value); }
        }

        /// <summary>
        /// Idenfities the <see cref="DialogTemplate"/>. This is a dependency property.
        /// </summary>
        public static readonly DependencyProperty DialogTemplateProperty =
          DependencyProperty.Register("DialogTemplate", typeof(object), ThisType, new PropertyMetadata(null), ValidateTemplateValue);

        /// <summary>
        /// Gets or sets the dialog template.
        /// </summary>
        /// <value>The dialog template.</value>
        public object DialogTemplate
        {
            get { return GetValue(DialogTemplateProperty); }
            set { SetValue(DialogTemplateProperty, value); }
        }

        private static bool ValidateTemplateValue(object value)
        {
            if (value == null) return true;
            if (value is DataTemplate || value is ComponentResourceKey) return true;
            return false;
        }

        /// <summary>
        /// Shows the dialog for editing property value.
        /// </summary>
        /// <param name="propertyValue">The property value.</param>
        /// <param name="commandSource">The command source.</param>
        public virtual void ShowDialog(PropertyItemValue propertyValue, IInputElement commandSource)
        {
        }
    }

}
